package org.example.flea_market_mvc.controller;

import org.example.flea_market_mvc.entity.PageInfo;
import org.example.flea_market_mvc.entity.Products;
import org.example.flea_market_mvc.param.ProductParam;
import org.example.flea_market_mvc.service.products.ProductsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/api/products")
@Validated
public class ProductsController {

    @Autowired
    private ProductsService productsService;

    @PostMapping
    public ApiResponse<String> addProduct(@Valid @RequestBody ProductParam productParam) {
        int result = productsService.insert(productParam);
        return result > 0 ? ApiResponse.success("添加商品成功") : ApiResponse.error(400, "添加商品失败");
    }

    @DeleteMapping("/{id}")
    public ApiResponse<String> deleteProduct(@PathVariable Integer id) {
        int result = productsService.deleteById(id);
        return result > 0 ? ApiResponse.success("删除商品成功") : ApiResponse.notFound("修改失败");
    }

    @PutMapping("/upDataProductStatus/{id}/{status}")
    public ApiResponse<String> upDataProductStatus(@PathVariable Integer id,@PathVariable Integer status){
        int result = productsService.upDataProductStatus(id,status);
        return result > 0 ? ApiResponse.success("删除成功") : ApiResponse.notFound("修改失败");
    }

    @PutMapping
    public ApiResponse<String> updateProduct(@Valid @RequestBody Products productParam) {
        int result = productsService.update(productParam);
        return result > 0 ? ApiResponse.success("修改商品成功") : ApiResponse.notFound("商品不存在");
    }

    @GetMapping("/{id}")
    public ApiResponse<Products> getProduct(@PathVariable Integer id) {
        Products product = productsService.selectById(id);
        return product != null ? ApiResponse.success(product) : ApiResponse.notFound("商品不存在");
    }

    /**
     * 获取所有商品列表（不推荐使用，数据量大时性能差）
     * @deprecated 请使用分页接口/getByPage
     */
    @Deprecated
    @GetMapping
    public ApiResponse<List<Products>> getAllProducts() {
        List<Products> products = productsService.selectAll();
        return ApiResponse.success(products);
    }

    /**
     * 分页获取商品列表
     * @param pageNum 页码(从1开始)
     * @param pageSize 每页数量
     * @return 分页商品数据
     */
    @GetMapping("/page")
    public ApiResponse<PageInfo<Products>> getProductsByPage(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        PageInfo<Products> pageInfo = productsService.selectByPage(pageNum, pageSize);
        return ApiResponse.success(pageInfo);
    }

    /**
     * 按分类分页获取商品列表
     * @param categoryId 分类ID
     * @param pageNum 页码(从1开始)
     * @param pageSize 每页数量
     * @return 分页商品数据
     */
    @GetMapping("/category/{categoryId}")
    public ApiResponse<PageInfo<Products>> getProductsByCategory(
            @PathVariable Integer categoryId,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        PageInfo<Products> pageInfo = productsService.selectByCategory(categoryId, pageNum, pageSize);
        return ApiResponse.success(pageInfo);
    }

    /**
     * 条件分页获取商品列表
     * 支持按名称、分类、状态等条件分页查询
     */
    @GetMapping("/search")
    public ApiResponse<PageInfo<Products>> searchProducts(ProductParam param) {
        PageInfo<Products> pageInfo = productsService.selectPage(param);
        return ApiResponse.success(pageInfo);
    }

    /**
     * 商品上架（仅商品发布者或管理员可操作）
     */
    @PutMapping("/{id}/up")
    public ApiResponse<String> upProduct(@PathVariable Integer id) {
        // TODO: 权限校验，只有商品发布者或管理员可操作
        int result = productsService.upProduct(id);
        return result > 0 ? ApiResponse.success("商品已上架") : ApiResponse.error(400, "上架失败");
    }

    /**
     * 商品下架（仅商品发布者或管理员可操作）
     */
    @PutMapping("/{id}/down")
    public ApiResponse<String> downProduct(@PathVariable Integer id) {
        // TODO: 权限校验，只有商品发布者或管理员可操作
        int result = productsService.downProduct(id);
        return result > 0 ? ApiResponse.success("商品已下架") : ApiResponse.error(400, "下架失败");
    }

    /**
     * 商品审核（仅分类管理员/管理员可操作）
     */
    @PutMapping("/{id}/audit")
    public ApiResponse<String> auditProduct(@PathVariable Integer id, @RequestParam Integer status) {
        // TODO: 权限校验，只有分类管理员/管理员可操作
        int result = productsService.auditProduct(id, status);
        return result > 0 ? ApiResponse.success("审核操作成功") : ApiResponse.error(400, "审核失败");
    }

    /**
     * 强制下架商品（仅分类管理员/管理员可操作）
     */
    @PutMapping("/{id}/force-down")
    public ApiResponse<String> forceDownProduct(@PathVariable Integer id) {
        // TODO: 权限校验，只有分类管理员/管理员可操作
        int result = productsService.forceDownProduct(id);
        return result > 0 ? ApiResponse.success("商品已强制下架") : ApiResponse.error(400, "操作失败");
    }
}